package com.aimee.jobscheduler;

import android.app.job.JobInfo;
import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    private static final int JOB_ID = 1;
    private static final int JOB_PERIODIC_TIME = 5 * 1000;

    private JobScheduler jobScheduler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initJobScheduler();
    }

    @OnClick(R.id.btn_stop_phone_service)
    public void onViewClicked() {
        Intent intent = new Intent(MainActivity.this, PhoneService.class);
        stopService(intent);// 关闭服务
    }

    private void initJobScheduler() {
        // JobScheduler类负责将应用需要执行的作业发送给框架，以准备对该应用Job的调度。JobScheduler是一个系统服务
        jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

        // JobInfo.Builder是JobInfo的一个内部类，顾名思义，它就是用来创建JobInfo的Builder类。
        JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, new ComponentName(this, MyJobScheduler.class));
        // 指定此job按提供的时间延迟。在定期job上，调用次方法将引发异常。
        builder.setMinimumLatency (1000);
        // 设置该Job为定期Job，即按照提供的间隔时间周期执行，一个周期内最多执行一次，如果设置该方法，则setMinimumLatency()和setOverrideDeadline()不可设置。
//        builder.setPeriodic(JOB_PERIODIC_TIME);
        // 设置是否在设备重新启动时保持此作业，此方法需要RECEIVE_BOOT_COMPLETED权限。
        builder.setPersisted(true);
        JobInfo jobInfo = builder.build();

        // JobInfo是传递给JobScheduler类的数据容器，它封装了针对调用应用程序调度作业所需的各种约束，
        // 也可以认为一个JobInfo对象对应一个作业，JobInfo对象通过JobInfo.Builder创建。它将作为参数传递给JobScheduler
        jobScheduler.schedule(jobInfo);
    }

    private void cancelJob(int jobId) {
        if (jobScheduler != null) {
            jobScheduler.cancel(jobId);
        }
    }

    private void cancelAllJob() {
        if (jobScheduler != null) {
            jobScheduler.cancelAll();
        }
    }
}
